import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
from datetime import datetime, timedelta
import warnings
warnings.filterwarnings('ignore')

# 设置中文字体和样式
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.style.use('_classic_test_patch')  # 使用seaborn样式

print("=== Matplotlib数据可视化实验 ===\n")

# 创建实验数据
np.random.seed(42)

# 数据集1：月度销售数据
months = ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月']
product_a_sales = [120, 135, 145, 160, 175, 190, 185, 200, 210, 195, 180, 165]
product_b_sales = [80, 90, 110, 120, 140, 155, 160, 170, 165, 150, 140, 130]
product_c_sales = [60, 70, 85, 95, 100, 110, 115, 125, 130, 135, 125, 120]

# 数据集2：学生成绩数据
np.random.seed(42)
math_scores = np.random.normal(75, 15, 100)
english_scores = np.random.normal(80, 12, 100)
science_scores = np.random.normal(78, 14, 100)

# 数据集3：股票价格数据
dates = pd.date_range('2024-01-01', periods=100, freq='D')
initial_price = 100
stock_prices = [initial_price]
for _ in range(99):
    change = np.random.normal(0, 2)
    new_price = max(stock_prices[-1] + change, 50)  # 确保价格不会低于50
    stock_prices.append(new_price)

# 任务1：基础图表绘制
print("任务1：基础图表绘制")
print("-" * 50)

fig, axes = plt.subplots(2, 3, figsize=(18, 12))
fig.suptitle('基础图表类型示例', fontsize=16, fontweight='bold')

# 1.1 线图 - 销售趋势
axes[0, 0].plot(months, product_a_sales, marker='o', linewidth=2, label='产品A')
axes[0, 0].plot(months, product_b_sales, marker='s', linewidth=2, label='产品B')
axes[0, 0].set_title('月度销售趋势')
axes[0, 0].set_xlabel('月份')
axes[0, 0].set_ylabel('销售额（万元）')
axes[0, 0].legend()
axes[0, 0].grid(True, alpha=0.3)
axes[0, 0].tick_params(axis='x', rotation=45)

# 1.2 柱状图 - 产品比较
q4_months = ['10月', '11月', '12月']
q4_a = [195, 180, 165]
q4_b = [150, 140, 130]
q4_c = [135, 125, 120]

x = np.arange(len(q4_months))
width = 0.25

axes[0, 1].bar(x - width, q4_a, width, label='产品A', alpha=0.8)
axes[0, 1].bar(x, q4_b, width, label='产品B', alpha=0.8)
axes[0, 1].bar(x + width, q4_c, width, label='产品C', alpha=0.8)
axes[0, 1].set_title('第四季度产品销量对比')
axes[0, 1].set_xlabel('月份')
axes[0, 1].set_ylabel('销售额（万元）')
axes[0, 1].set_xticks(x)
axes[0, 1].set_xticklabels(q4_months)
axes[0, 1].legend()

# 1.3 饼图 - 市场份额
market_share = [sum(product_a_sales), sum(product_b_sales), sum(product_c_sales)]
labels = ['产品A', '产品B', '产品C']
colors = ['#ff9999', '#66b3ff', '#99ff99']
explode = (0.1, 0, 0)  # 突出显示产品A

axes[0, 2].pie(market_share, labels=labels, colors=colors, explode=explode,
               autopct='%1.1f%%', shadow=True, startangle=90)
axes[0, 2].set_title('年度市场份额分布')

# 1.4 散点图 - 成绩关系
axes[1, 0].scatter(math_scores, english_scores, alpha=0.6, c=science_scores,
                   cmap='viridis', s=50)
axes[1, 0].set_title('数学与英语成绩关系')
axes[1, 0].set_xlabel('数学成绩')
axes[1, 0].set_ylabel('英语成绩')
colorbar = plt.colorbar(axes[1, 0].collections[0], ax=axes[1, 0])
colorbar.set_label('科学成绩')

# 1.5 直方图 - 成绩分布
axes[1, 1].hist(math_scores, bins=20, alpha=0.7, color='skyblue', edgecolor='black')
axes[1, 1].set_title('数学成绩分布')
axes[1, 1].set_xlabel('成绩')
axes[1, 1].set_ylabel('学生人数')
axes[1, 1].axvline(math_scores.mean(), color='red', linestyle='--',
                   label=f'平均分: {math_scores.mean():.1f}')
axes[1, 1].legend()

# 1.6 股票价格走势
axes[1, 2].plot(dates, stock_prices, linewidth=1.5, color='green')
axes[1, 2].fill_between(dates, stock_prices, alpha=0.3, color='lightgreen')
axes[1, 2].set_title('股票价格走势')
axes[1, 2].set_xlabel('日期')
axes[1, 2].set_ylabel('价格（元）')
axes[1, 2].tick_params(axis='x', rotation=45)

plt.tight_layout()
plt.show()

# 任务2：图表美化与定制
print("\n任务2：图表美化与定制")
print("-" * 50)

# 创建美化的销售趋势图
plt.figure(figsize=(12, 8))

# 自定义颜色和样式
colors = ['#2E86AB', '#A23B72', '#F18F01']
line_styles = ['-', '--', '-.']
markers = ['o', 's', '^']

for i, (sales, label) in enumerate(zip([product_a_sales, product_b_sales, product_c_sales],
                                      ['产品A', '产品B', '产品C'])):
    plt.plot(months, sales,
             color=colors[i],
             linestyle=line_styles[i],
             marker=markers[i],
             linewidth=3,
             markersize=8,
             label=label,
             alpha=0.8)

# 图表美化
plt.title('2024年度产品销售趋势分析', fontsize=18, fontweight='bold', pad=20)
plt.xlabel('月份', fontsize=14, fontweight='bold')
plt.ylabel('销售额（万元）', fontsize=14, fontweight='bold')

# 设置网格
plt.grid(True, linestyle=':', alpha=0.6, color='gray')

# 设置图例
plt.legend(fontsize=12, loc='upper left', frameon=True, shadow=True,
           fancybox=True, borderpad=1)

# 设置坐标轴
plt.xticks(fontsize=11, rotation=45)
plt.yticks(fontsize=11)

# 添加背景色
plt.gca().set_facecolor('#f8f9fa')

# 调整边距
plt.tight_layout()

# 保存高质量图片
plt.savefig('sales_trend_beautiful.png', dpi=300, bbox_inches='tight',
            facecolor='white', edgecolor='none')
plt.show()

# 任务3：子图布局设计
print("\n任务3：子图布局设计")
print("-" * 50)

# 3.1 不规则子图布局
fig = plt.figure(figsize=(15, 10))

# 创建不同大小的子图
gs = fig.add_gridspec(3, 4, hspace=0.3, wspace=0.3)

# 大图 - 占据前两行
ax1 = fig.add_subplot(gs[0:2, :])
ax1.plot(dates, stock_prices, linewidth=2, color='darkblue')
ax1.set_title('主图：股票价格走势', fontsize=14, fontweight='bold')
ax1.set_ylabel('价格（元）')
ax1.grid(True, alpha=0.3)

# 小图1 - 销量对比
ax2 = fig.add_subplot(gs[2, 0:2])
total_sales = [sum(x) for x in [product_a_sales, product_b_sales, product_c_sales]]
ax2.bar(['产品A', '产品B', '产品C'], total_sales, color=['#ff6b6b', '#4ecdc4', '#45b7d1'])
ax2.set_title('年度总销量')
ax2.set_ylabel('销售额（万元）')

# 小图2 - 成绩分布
ax3 = fig.add_subplot(gs[2, 2:])
ax3.boxplot([math_scores, english_scores, science_scores],
            labels=['数学', '英语', '科学'])
ax3.set_title('各科成绩分布')
ax3.set_ylabel('成绩')

plt.suptitle('复合布局数据分析仪表板', fontsize=16, fontweight='bold')
plt.show()

# 3.2 共享坐标轴的子图
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 8), sharex=True)

# 上图：价格
ax1.plot(dates, stock_prices, linewidth=2, color='blue', label='股价')
ax1.set_ylabel('价格（元）', fontsize=12)
ax1.set_title('股票价格与成交量', fontsize=14, fontweight='bold')
ax1.legend()
ax1.grid(True, alpha=0.3)

# 下图：成交量（模拟数据）
volume = np.random.randint(1000, 5000, len(dates))
ax2.bar(dates, volume, alpha=0.7, color='orange', width=0.8)
ax2.set_ylabel('成交量', fontsize=12)
ax2.set_xlabel('日期', fontsize=12)
ax2.tick_params(axis='x', rotation=45)

plt.tight_layout()
plt.show()

# 任务4：高级可视化技术
print("\n任务4：高级可视化技术")
print("-" * 50)

# 4.1 双Y轴图表
fig, ax1 = plt.subplots(figsize=(12, 6))

# 左Y轴 - 销售额
ax1.set_xlabel('月份')
ax1.set_ylabel('销售额（万元）', color='blue')
line1 = ax1.plot(months, product_a_sales, 'b-', marker='o', linewidth=2, label='销售额')
ax1.tick_params(axis='y', labelcolor='blue')
ax1.tick_params(axis='x', rotation=45)

# 右Y轴 - 利润率
ax2 = ax1.twinx()
profit_rate = [rate + np.random.normal(0, 2) for rate in [15, 16, 18, 20, 22, 25, 23, 26, 28, 24, 21, 19]]
ax2.set_ylabel('利润率（%）', color='red')
line2 = ax2.plot(months, profit_rate, 'r--', marker='s', linewidth=2, label='利润率')
ax2.tick_params(axis='y', labelcolor='red')

# 添加图例
lines = line1 + line2
labels = [l.get_label() for l in lines]
ax1.legend(lines, labels, loc='upper left')

plt.title('销售额与利润率双轴图', fontsize=14, fontweight='bold')
plt.tight_layout()
plt.show()

# 4.2 堆叠柱状图
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 6))

# 堆叠柱状图
quarters = ['Q1', 'Q2', 'Q3', 'Q4']
a_quarterly = [400, 525, 595, 540]
b_quarterly = [260, 415, 495, 420]
c_quarterly = [215, 305, 370, 380]

ax1.bar(quarters, a_quarterly, label='产品A', alpha=0.8)
ax1.bar(quarters, b_quarterly, bottom=a_quarterly, label='产品B', alpha=0.8)
ax1.bar(quarters, c_quarterly, bottom=np.array(a_quarterly) + np.array(b_quarterly),
        label='产品C', alpha=0.8)
ax1.set_title('季度销售额堆叠图')
ax1.set_ylabel('销售额（万元）')
ax1.legend()

# 分组柱状图
x = np.arange(len(quarters))
width = 0.25

ax2.bar(x - width, a_quarterly, width, label='产品A', alpha=0.8)
ax2.bar(x, b_quarterly, width, label='产品B', alpha=0.8)
ax2.bar(x + width, c_quarterly, width, label='产品C', alpha=0.8)
ax2.set_title('季度销售额分组图')
ax2.set_ylabel('销售额（万元）')
ax2.set_xticks(x)
ax2.set_xticklabels(quarters)
ax2.legend()

plt.tight_layout()
plt.show()

# 4.3 箱线图分析
plt.figure(figsize=(10, 6))

# 创建不同产品的销售数据分布
product_a_dist = np.random.normal(160, 25, 100)
product_b_dist = np.random.normal(130, 20, 100)
product_c_dist = np.random.normal(110, 15, 100)

box_data = [product_a_dist, product_b_dist, product_c_dist]
box_labels = ['产品A', '产品B', '产品C']

bp = plt.boxplot(box_data, labels=box_labels, patch_artist=True,
                notch=True, showmeans=True)

# 自定义箱线图颜色
colors = ['lightblue', 'lightgreen', 'lightcoral']
for patch, color in zip(bp['boxes'], colors):
    patch.set_facecolor(color)
    patch.set_alpha(0.7)

plt.title('产品销售额分布箱线图', fontsize=14, fontweight='bold')
plt.ylabel('销售额（万元）')
plt.grid(True, alpha=0.3)
plt.show()

# 4.4 相关性热力图
plt.figure(figsize=(8, 6))

# 创建相关性数据
correlation_data = np.array([
    [1.0, 0.8, 0.6, 0.3],
    [0.8, 1.0, 0.7, 0.4],
    [0.6, 0.7, 1.0, 0.5],
    [0.3, 0.4, 0.5, 1.0]
])

features = ['销售额', '广告投入', '客户满意度', '价格']

im = plt.imshow(correlation_data, cmap='coolwarm', aspect='auto', vmin=-1, vmax=1)
plt.colorbar(im, label='相关系数')

# 设置坐标轴
plt.xticks(range(len(features)), features, rotation=45)
plt.yticks(range(len(features)), features)

# 添加数值标签
for i in range(len(features)):
    for j in range(len(features)):
        plt.text(j, i, f'{correlation_data[i, j]:.2f}',
                ha='center', va='center', fontweight='bold')

plt.title('特征相关性热力图', fontsize=14, fontweight='bold')
plt.tight_layout()
plt.show()

# 任务5：综合案例 - 数据分析报告
print("\n任务5：综合案例设计")
print("-" * 50)

# 创建综合分析报告
fig = plt.figure(figsize=(16, 20))
fig.suptitle('2024年度销售数据分析报告', fontsize=20, fontweight='bold', y=0.95)

# 设置网格布局
gs = fig.add_gridspec(6, 2, height_ratios=[1, 1, 1, 1, 1, 0.5], hspace=0.3, wspace=0.25)

# 图表1: 月度销售趋势
ax1 = fig.add_subplot(gs[0, :])
ax1.plot(months, product_a_sales, 'o-', linewidth=3, markersize=6, label='产品A')
ax1.plot(months, product_b_sales, 's-', linewidth=3, markersize=6, label='产品B')
ax1.plot(months, product_c_sales, '^-', linewidth=3, markersize=6, label='产品C')
ax1.set_title('月度销售趋势', fontsize=14, fontweight='bold')
ax1.set_ylabel('销售额（万元）')
ax1.legend(loc='upper left')
ax1.grid(True, alpha=0.3)
ax1.tick_params(axis='x', rotation=45)

# 图表2: 季度对比
ax2 = fig.add_subplot(gs[1, 0])
quarters = ['Q1', 'Q2', 'Q3', 'Q4']
total_quarterly = [875, 1245, 1460, 1340]
bars = ax2.bar(quarters, total_quarterly, color=['#FF6B6B', '#4ECDC4', '#45B7D1', '#96CEB4'])
ax2.set_title('季度销售总额', fontsize=14, fontweight='bold')
ax2.set_ylabel('销售额（万元）')
# 添加数值标签
for bar in bars:
    height = bar.get_height()
    ax2.text(bar.get_x() + bar.get_width()/2., height,
             f'{height}', ha='center', va='bottom', fontweight='bold')

# 图表3: 市场份额
ax3 = fig.add_subplot(gs[1, 1])
market_share = [sum(product_a_sales), sum(product_b_sales), sum(product_c_sales)]
colors = ['#FF9999', '#66B3FF', '#99FF99']
wedges, texts, autotexts = ax3.pie(market_share, labels=['产品A', '产品B', '产品C'],
                                   colors=colors, autopct='%1.1f%%',
                                   startangle=90, explode=(0.1, 0, 0))
ax3.set_title('市场份额分布', fontsize=14, fontweight='bold')

# 图表4: 产品表现雷达图（使用极坐标模拟）
ax4 = fig.add_subplot(gs[2, 0], projection='polar')
categories = ['销售额', '增长率', '市场份额', '客户满意度', '利润率']
A_values = [0.9, 0.8, 0.85, 0.7, 0.75]
B_values = [0.7, 0.6, 0.6, 0.8, 0.65]

angles = np.linspace(0, 2 * np.pi, len(categories), endpoint=False).tolist()
A_values += A_values[:1]  # 闭合图形
B_values += B_values[:1]
angles += angles[:1]

ax4.plot(angles, A_values, 'o-', linewidth=2, label='产品A', color='red')
ax4.fill(angles, A_values, alpha=0.25, color='red')
ax4.plot(angles, B_values, 'o-', linewidth=2, label='产品B', color='blue')
ax4.fill(angles, B_values, alpha=0.25, color='blue')
ax4.set_xticks(angles[:-1])
ax4.set_xticklabels(categories)
ax4.set_title('产品综合表现雷达图', fontsize=14, fontweight='bold', pad=20)
ax4.legend(loc='upper right', bbox_to_anchor=(1.3, 1.0))

# 图表5: 销售预测
ax5 = fig.add_subplot(gs[2, 1])
# 模拟未来3个月预测
future_months = ['2025-1月', '2025-2月', '2025-3月']
predicted_sales = [172, 185, 195]
ax5.plot(months[-3:] + future_months, product_a_sales[-3:] + predicted_sales,
         'o-', linewidth=3, color='green', label='实际+预测')
ax5.axvline(x=2.5, color='red', linestyle='--', alpha=0.7, label='预测起点')
ax5.set_title('销售预测', fontsize=14, fontweight='bold')
ax5.set_ylabel('销售额（万元）')
ax5.legend()
ax5.tick_params(axis='x', rotation=45)

# 图表6: 地区销售分布
ax6 = fig.add_subplot(gs[3, :])
regions = ['华北', '华东', '华南', '华中', '西南', '西北', '东北']
region_sales = [280, 320, 290, 200, 180, 120, 160]
bars = ax6.barh(regions, region_sales, color=plt.cm.viridis(np.linspace(0, 1, len(regions))))
ax6.set_title('各地区销售分布', fontsize=14, fontweight='bold')
ax6.set_xlabel('销售额（万元）')

# 图表7: 客户满意度分析
ax7 = fig.add_subplot(gs[4, 0])
satisfaction_levels = ['非常满意', '满意', '一般', '不满意', '非常不满意']
satisfaction_counts = [45, 35, 15, 3, 2]
colors_satisfaction = ['#2E8B57', '#90EE90', '#FFD700', '#FFA500', '#FF6347']
ax7.bar(satisfaction_levels, satisfaction_counts, color=colors_satisfaction)
ax7.set_title('客户满意度调查', fontsize=14, fontweight='bold')
ax7.set_ylabel('客户数量')
ax7.tick_params(axis='x', rotation=45)

# 图表8: 成本结构分析
ax8 = fig.add_subplot(gs[4, 1])
cost_categories = ['原材料', '人工', '运输', '营销', '其他']
cost_percentages = [40, 25, 15, 12, 8]
colors_cost = ['#FF7F7F', '#7FFF7F', '#7F7FFF', '#FFFF7F', '#FF7FFF']
wedges, texts, autotexts = ax8.pie(cost_percentages, labels=cost_categories,
                                   colors=colors_cost, autopct='%1.1f%%', startangle=90)
ax8.set_title('成本结构分析', fontsize=14, fontweight='bold')

# 总结文本
ax9 = fig.add_subplot(gs[5, :])
ax9.axis('off')
summary_text = """
关键洞察：
• 产品A表现最佳，全年销售额2060万元，市场份额44.8%
• 第三季度是销售高峰期，总销售额达1460万元  
• 华东地区是最大市场，销售额320万元
• 客户满意度较高，80%客户表示满意或非常满意
• 原材料成本占比40%，需要关注成本控制
"""

ax9.text(0.05, 0.5, summary_text, fontsize=12, verticalalignment='center',
         bbox=dict(boxstyle="round,pad=0.5", facecolor='lightblue', alpha=0.5))

# 保存为PDF格式
plt.savefig('sales_analysis_report.pdf', format='pdf', dpi=300, bbox_inches='tight')
plt.show()

print("✅ 综合数据分析报告已生成并保存为PDF格式")
print("✅ 所有可视化任务完成！")